在上一篇中,我們提到有數種方法可以改變這個程式的執行路徑:
gdb 改掉 eip
eip 蓋掉print_flag (如果 flag 有寫在程式內的話)由於 1 很明顯不能做,故我們可以試著用 2 的方法來做。
前一篇當中有提到可以用 info functions 來找到我們要的函式的位置,其位置為 0x0804854b。
其實也有另一種方法,可以拿到此數值:
readelf -a ./pwn2
在上一篇當中,我們也有看到 echo 函式的內容:

程式的執行路徑大概是這樣:
ebp - 0xef 推到 eax
eax 推到 stack 上eax 指的位置一個函式在 ret 時 (x86),會把 stack 上的數值 pop 出來,並寫到 eip 暫存器上。此時下一步將會跑去 eip 所指的位置來執行程式。我們若在第三步時,讓 gets 蓋掉在 stack 上的 eip,就可以影響 echo 函式返回時會呼叫的函式。
由於我們可以知道 gets 的目標是 ebp - 0xef,而我們的 eip 會在 ebp 附近,故可以推算出要送多少長度的字出去。
--------stack 頂端------- (esp)
本地變數
...
(ebp - 0xef)
...
...
存在 stack 上的 ebp (0xef, EBP 位置指向此處)
存在 stack 上的 eip
---main 的 stack frame --
...
我們來試著計算長度。
int(0xef) = 239
int(0x4) = 4
239 + 4 = 243
因為要計入 ebp 的長度,故要加上 4 byte。
